#ifndef CAPTUREPACKETHEADERS_H
#define CAPTUREPACKETHEADERS_H

#include<sys/types.h>
#include<arpa/inet.h>

//以太网
struct et_header {
    u_int8_t et_destination[6]; //目的地址
    u_int8_t et_source[6]; //源地址
    u_int16_t et_type; //协议类型
};


//ip
struct ip_header {
#ifdef WORDS_BIGENDIAN
    u_int16_t ip_version:4,         // 版本
        ip_header_length:4;   // 头部长度
#else
    u_int8_t ip_header_length:4,
        ip_version:4;
#endif

    u_int8_t ip_tos;                // 服务类型
    u_int16_t ip_length;            // 总长度
    u_int16_t ip_id;                // 标识符
    u_int16_t ip_off;               // 片偏移
    u_int8_t ip_ttl;                // 生存时间
    u_int8_t ip_protocol;           // 协议
    u_int16_t ip_checksum;        // 校验和
    struct in_addr ip_source_address;   // 源IP地址
    struct in_addr ip_destination_address;  // 目的IP地址
};

//arp
struct arp_header {
    u_int16_t arp_hardware_type;        // 硬件类型
    u_int16_t arp_protocol_type;        // 协议类型
    u_int8_t arp_hardware_length;       // 硬件地址长度
    u_int8_t arp_protocol_length;       // 协议地址长度
    u_int16_t arp_operation_code;       // 操作码
    u_int8_t arp_source_ethernet_address[6];    // 源MAC地址
    u_int8_t arp_source_ip_address[4];          // 源IP地址
    u_int8_t arp_destination_ethernet_address[6];   // 目标MAC地址
    u_int8_t arp_destination_ip_address[4];         // 目标IP地址
};

// tcp
struct tcp_header {
    u_int16_t tcp_source_port;          // 源端口
    u_int16_t tcp_destination_port;     // 目的端口
    u_int32_t tcp_sequence;             // 序列号
    u_int32_t tcp_ack;                  // 确认位
#ifdef WORDS_BIGENDIAN
    u_int8_t tcp_offset:4,              // 数据偏移
        tcp_reserved:4;                 // 保留位
#else
    u_int8_t tcp_reserved:4,
        tcp_offset:4;
#endif

    u_int8_t tcp_flags;                  // 标志位
    u_int16_t tcp_windows;              // 窗口大小
    u_int16_t tcp_checksum;             // 校验和
    u_int16_t tcp_urgent_pointer;       // 紧急指针
};

//udp
struct udp_header {
    u_int16_t udp_source_port;          // 源端口
    u_int16_t udp_destination_port;     // 目的端口
    u_int16_t udp_length;               // 数据长度
    u_int16_t udp_checksum;             // 校验和
};

//ICMP
struct icmp_header {
    u_int8_t icmp_type;                 // 类型
    u_int8_t icmp_code;                 // 代码
    u_int16_t icmp_checksum;            // 校验和
    u_int16_t icmp_identifier;          // 标识符
    u_int16_t icmp_sequence;            // 序列号
};


#endif // CAPTUREPACKETHEADERS_H
